<script type='text/javascript' template='<?php echo basename(__FILE__); ?>'>
/**
 * Класс для работы с навигацией при помощи якорей.
 * Редирект с урлов с якорями на нормальные при первом заходе, для срабатывания фильтров.
 * Запоминание хэша, добавление параметров в хэш и другое.
 */
function HashNavigation() {
	/**
	 * Добавляем параметр за решетку, для дальнейшего использования в редиректах и навигации.
	 *
	 * @param string $key
	 * @param string $value
	 * @return void
	 */
	this.setParam = function($key, $value) {
		var $hash = document.location.hash;
		var $params = paramsToArray($hash);
		
		$params[$key] = $value;
		$params = paramsToString($params);
		document.location.hash = '#' + $params;
	}
	
	/**
	 * Обрабатывает строку из параметров. Добавляет их все в хэш.
	 *
	 * @param string $params
	 * @return void
	 */
	this.setParams = function($params) {
		$params = paramsToArray($params);
		$params2 = paramsToArray(document.location.hash);
		
		$params = paramsMerge($params2, $params);
		$params = paramsToString($params);
		document.location.hash = '#' + $params;
	}
	
	/**
	 * Функция делает редирект страницы на саму себя, но перед этип перебрасывает параметры из хэша в QUERY_STRING.
	 *
	 * @return void
	 */
	this.redirect = function() {
		var $url = document.location.protocol + '//' + document.location.hostname + document.location.pathname + '?';
		var $params = paramsToArray(document.location.search);
		var $params2 = paramsToArray(document.location.hash);

		// Сливаем два массива
		$params = paramsMerge($params, $params2);
		// Проходимся по итоговому массиву параметров и формируем полный URL для редиректа
		$params = paramsToString($params);
		$url += $params;
		document.location.href = $url;
	}
	
	/**
	 * Функция, нужная для извлечения параметров из строки document.location.search и document.location.hash.
	 * В обоих случаях возвращает массив параметров.
	 *
	 * @param string $params
	 * @return array
	 */
	var paramsToArray = function($params) {
		var $return = [];
		
		$params = trim($params, '?');
		$params = trim($params, '#');
		$params = trim($params, '&');
		$params = $params.split('&');
		for (var $key in $params) {
			var $part = $params[$key].split('=');
			if ($part[0]) {
				$return[ $part[0] ] = $part[1];
			}
		}
		
		return $return;		
	}
	
	/**
	 * Функция нужная для сборки массива параметров в строку QUERY_STRING.
	 *
	 * @param array $params
	 * @return string
	 */
	var paramsToString = function($params) {
		var $string = '';
		for (var $key in $params) {
			$string += $key + '=' + $params[$key] + '&';
		}
		
		$string = trim($string, '&');
		return $string;
	}
	
	/**
	 * Аналог array_merge. Сливает два массива параметров. Принимает два массива, отдает один.
	 *
	 * @param array $params 
	 * @param array $params2
	 * @return array
	 */
	var paramsMerge = function($params, $params2) {
		// Проходимся по первому массиву 1, заменяем ключи в нем значениями из массива 2, если они присутствуют
		for (var $key in $params) {
			if ($params2[$key] !== undefined) {
				$params[$key] = $params2[$key];
			}
		}
		
		// Проходимся по второму массиву параметров, добавляем в исходный массив те значения, которых там ещё нет
		for (var $key in $params2) {
			if ($params[$key] === undefined) {
				$params[$key] = $params2[$key];
			}
		}	
		
		return $params;
	}
}

// Если у нас присутствует хэш, производим редирект на страницу с настоящими параметрами, перебрасывая параметры хэша
window.HashNavigation = new HashNavigation;
if (document.location.hash) {
	window.HashNavigation.redirect();
}

</script>
